package com.bw.controller;

import com.alibaba.fastjson.JSON;
import com.bw.entity.User;
import com.bw.mapper.UserMapper;
import org.spring.kun.common.Md5Utils;
import org.spring.kun.common.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.concurrent.TimeUnit;

@Controller
public class LoginController {

    @Autowired
    UserMapper userMapper;

    @Autowired
    RedisTemplate redisTemplate;

    @RequestMapping("/loginPage.do")
    public String loginPage() {

        return "login";
    }

    @RequestMapping("/login.do")
    public String login(@Valid User user, BindingResult result, Model model, HttpServletResponse response) {
        //1. 非空验证
        if (result.hasErrors()) {
            model.addAttribute("error", result.getAllErrors().get(0).getDefaultMessage());
            return "login";
        }
        // 2.用户名不存在
        User userDB = userMapper.selectByName(user.getName());
        if (userDB == null) {
            model.addAttribute("error", "用户名不存在");
            return "login";
        }

        //3.密码是否正确

        String reqPassword = user.getPassword();// 用户输入的密码
        String salt = userDB.getSalt();//数据库里的盐

        String password = userDB.getPassword();//数据库里的乱码

        String md5String = Md5Utils.getMD5String(reqPassword + salt);

        if (!md5String.equals(password)){
            model.addAttribute("error", "密码错误");
            return "login";
        }

        // 加密用户信息  得到token   把token放入cookie  把cookie返回给浏览器

        TokenUtils.responseTokenByCookie(userDB,response);
        //把用户信息存入Redis 设置过期时间为30 min
        redisTemplate.opsForValue().set(userDB.getName(), JSON.toJSONString(userDB),30, TimeUnit.MINUTES);
        return "redirect:list.do";
    }
}
